#ifndef SDS_H
#define SDS_H

#include <stdio.h>

typedef char *sds;

#ifdef _WIN32
#define PACK(__Declaration__) _Pragma("pack(push, 1)") __Declaration__ _Pragma("pack(pop)")

PACK(typedef struct {
    /*
     * sds已用字节数
     * 用于实现O(1)的时间复杂度获取sds长度
     */
    int len;
    /*
     * sds可用的字节数
     * 用于实现惰性释放空间
     */
    int free;
    /*
     * buf是一个灵活数组成员，它不占用结构体本身的空间
     */
    char buf[];
} sdshdr;)

#else
typedef struct __attribute__((packed)) {
    int  len;
    int  free;
    char buf[];
} sdshdr;
#endif

sds   sds_create(const void *init, const size_t init_len);
sds   sds_create_empty(const size_t len);
sds   sds_new(const char *str);
sds   sds_dup(const sds s);
sds   sds_update(sds old_s, const void *new_s, const size_t len);
sds   sds_cat(sds s, const char *t);
sds   sds_cat_len(sds s, const void *t, size_t len);
sds   sds_cat_printf(sds s, const char *t, ...);
void  sds_delete_range(sds s, const int start, const int end);
sds   sds_get_range(sds s, const int start, const int end);
char *sds_get_str(sds s);
char *sds_get_str_range(sds s, const int start, const int end);
int   sds_index_of(sds s, const char c);
int   sds_index_of_start(sds s, int start, const char c);
int   sds_index_last_of(sds s, const char c);
sds  *sds_split(const char *s, const int len, const char *sep, const int sep_len, int *count);
void  sds_free_split(sds *tokens, int count);
int   sds_compare(const sds a, const sds b);
char *sds_to_str(sds s);
char *sds_to_str_range(sds s, const int start, const int end);
void  sds_to_lower(sds s);
void  sds_to_upper(sds s);
void  sds_incr_len(const sds s, const int incr);
void  sds_update_len(const sds s, const int new_len);
sds   sds_make_room(sds s, const int read_len);
void  sds_clear(const sds s);
void  sds_free(const sds s);
int   sds_len(const sds s);
int   sds_free_len(const sds s);
int   sds_is_empty(const sds s);

#endif //SDS_H
